package com.example.aling.happyenglish;

import android.content.ContentValues;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

// 首页（实现查询功能）
public class MainActivity extends AppCompatActivity {
    EditText et_search;   // 搜索内容
    TextView tv_result,search_title;  // 查询标题显示
    String strResultJson;   // 查询结果
    MyThread myThread;      // 自定义线程
    MyHandler myHandler;    // 自定义消息处理
    Button  btn_clear;      // 清除查询按钮
    MyHelper myHelper;      // 连接数据库及数据操作
    ImageView search_cancel;  // 搜索框的清空按钮
    String search_tx = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 绑定控件
        et_search = findViewById(R.id.et_search);
        tv_result = findViewById(R.id.tv_result);
        search_title = findViewById(R.id.search_title);
        btn_clear = findViewById(R.id.btn_clear);

        myHandler = new MyHandler();  //自动绑定Looper对象
        myHelper = new MyHelper(this);

        search_cancel = findViewById(R.id.search_cancel);

        // 根据搜索框是否获取焦点，来判断搜索框的“×”是否显示
        et_search.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus)
                    search_cancel.setVisibility(View.VISIBLE);
                else
                    search_cancel.setVisibility(View.INVISIBLE);
            }
        });
    }

    // 点击查询
    public void onClickSearch(View view) {
        // 判断输入框是否有内容，没有内容则不进行查询
        String text = et_search.getText().toString();
        if (text.length()==0){
            Toast.makeText(MainActivity.this, "请先输入单词", Toast.LENGTH_SHORT).show();
            return ;
        }

        // 防止重复点击查询同个单词
        if (text.equals(search_tx)){
            Toast.makeText(MainActivity.this, "请勿重复查询", Toast.LENGTH_SHORT).show();
            return ;
        }

        search_tx = text;

        // 清除对搜索框的焦点
        et_search.clearFocus();

        // 新建线程，并进行网络请求
        myThread = new MyThread();
        myThread.start();
    }

    // 设置ContentValues键值对
    private void addValues(String word,String familiar){
        // 设置参数
        ContentValues values = new ContentValues();
        values.put("word",word);
        values.put("familiar",familiar);
        // 调用myHelper添加数据
        myHelper.add(values,myHelper);
    }

    // 点击清空搜索框
    public void onClickClearSearch(View view) {
        et_search.setText("");
    }

    // 清除查询结果
    public void onClickClear(View view) {
        et_search.setText("");
        et_search.clearFocus();
        tv_result.setVisibility(View.INVISIBLE);
        search_title.setVisibility(View.INVISIBLE);
        btn_clear.setVisibility(View.INVISIBLE);
    }

    // 跳转到“收藏夹”
    public void onClickJump(View view) {
        Intent intent = new Intent(MainActivity.this,CollectionActivity.class);
        startActivityForResult(intent,100);
    }

    // 从“收藏夹”返回
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 100 && resultCode == 101){
            // 获取“收藏夹”中点击的单词数据
            String word = data.getStringExtra("word");
            if (word != null){
                // 点击查询
                et_search.setText(word);
                onClickSearch(et_search);
            }
        }
    }

    // 网络请求，作为子线程，不影响界面
    class MyThread extends Thread{
        @Override
        public void run(){
            super.run();
            try {
                // 定义请求URL和参数
                String url = "https://dict.youdao.com/suggest?num=1&doctype=json";
                String content = et_search.getText().toString();
                // 请求参数进行URL编码
                String encodedContent = URLEncoder.encode(content, StandardCharsets.UTF_8.toString());
                // 完整URL
                String requestURL = url + "&q=" + encodedContent;

                // 创建URL对象
                URL obj = new URL(requestURL);
                //打开连接
                HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
                // 设置请求方法
                conn.setRequestMethod("GET");
                // 设置请求头，指定接受的数据类型
                conn.setRequestProperty("Accept", "application/json");
                // 发送请求(隐式触发与服务器的连接)
                int resCode = conn.getResponseCode();
                // 发送请求成功，状态码为200
                Log.i("haha","resCode = "+resCode);
                if (resCode != 200){
                    Toast.makeText(MainActivity.this,"查询失败",Toast.LENGTH_SHORT).show();
                    return ;
                }

                // 读取响应
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder response = new StringBuilder();
                String lines;
                while ((lines = br.readLine()) != null){
                    response.append(lines);
                }
                br.close();

                // 保存查询结果为字符串
                strResultJson = response.toString();

                // 发消息通知主线程更新输出TextView
                Message msg = myHandler.obtainMessage();
                msg.what = 200;
                myHandler.sendMessage(msg);
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    // 消息处理
    class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            if (msg.what == 200){
                String strResult = jsonToText(strResultJson);
                // 显示查询标题文字
                search_title.setVisibility(View.VISIBLE);
                btn_clear.setVisibility(View.VISIBLE);
                tv_result.setVisibility(View.VISIBLE);
                // 查询失败
                if (strResult == null){
                    tv_result.setText("查询失败，没有该单词！");
                }
                // 查询成功
                else{
                    // 正则表达式，使得查询结果根据词性换行
                    // [;；]匹配分号   \s匹配空格
                    // (?=[a-zA-Z])匹配字母开头（正向前瞻断言，表示当前位置后必须是一个字母，但不包括在匹配结果中）
                    strResult = strResult.replaceAll("[;；]\\s(?=[a-zA-Z])", ";\n");
//                    strResult = strResult.replaceAll("；|;", "\n");
                    Log.i("haha",strResult);
                    tv_result.setText(strResult);
                    addValues(et_search.getText().toString(),"*");
                }
            }
        }
    }

    // 对JSON结果进行解码
    private String jsonToText(String  strJson){
        String strResult = "";
        try{
            JSONObject jsonObj = new JSONObject(strJson);
            // 解构第一层，获得result:{ msg:'...' , code :200 }
            JSONObject resultObj = jsonObj.getJSONObject("result");
            int code = resultObj.optInt("code");
            if (code != 200) return null;

            // 解构第二层，获取单词解释data:{ entries : [ explain : "..." ] }
            JSONObject data = jsonObj.getJSONObject("data");
            JSONArray entries = data.getJSONArray("entries");
            JSONObject explain = entries.getJSONObject(0);
            strResult = explain.getString("explain");

        }catch (JSONException e){
            e.printStackTrace();
        }
        return strResult;
    }
}
